'use strict';

module.exports = app => {
  const mongoose = app.mongoose;
  const Schema = mongoose.Schema;

  const userSchema = new Schema({
    /**
    * 用户名
    */
    user: { type: String, default: '' },
    /**
     * 用户密码（经过MD5加密的数据）
     */
    pass: { type: String, default: '' },
    /**
     * 登录错次数
     */
    loginErrNum: { type: Number, default: 0 },
    /**
     * 创建时间
     */
    createTime: { type: Date, default: new Date() },
    /**
     * 用户头像
     */
    icon: { type: String, default: '/webnuxt-api/public/img/user-icon.png' },
    /**
     * 用户类型
     */
    type: { type: String, enum: [ 'ADMIN', 'VISITORS' ], default: 'VISITORS' },
    /**
     * 用户角色
     */
    role: { type: Schema.Types.ObjectId, ref: 'Role' },
    /**
     * 是否启用
     */
    enabled: { type: Boolean, default: true },
  });

  // eslint-disable-next-line jsdoc/require-param
  /**
   * 根据账号获取用户信息
   */
  userSchema.statics.findWithUser = function(user) {
    return this.findOne({ user }).populate('role').exec();
  };

  // eslint-disable-next-line jsdoc/require-param
  /**
   * 更新当前用户数据
   */
  userSchema.statics.updateCurrentUser = function(user, upData) {
    return this.updateOne({ user }, upData);
  };

  /**
   * 添加登录错误次数
   */
  userSchema.methods.addLoginErrNum = function() {
    this.loginErrNum += 1;
    return this.model('User').updateOne(
      { user: this.user },
      { loginErrNum: this.loginErrNum });
  };

  /**
   * 清除登录错误次数
   */
  userSchema.methods.clearLoginErrNum = function() {
    this.loginErrNum = 0;
    return this.model('User').updateOne(
      { user: this.user },
      { loginErrNum: this.loginErrNum });
  };

  // eslint-disable-next-line jsdoc/require-param
  /**
   * 获取所有用户
   */
  userSchema.statics.findAll = function() {
    const model = this.find({
      type: 'VISITORS',
    }, 'enabled role user _id');
    model.populate({
      path: 'role',
      select: 'name _id',
    });
    return model.exec();
  };

  // eslint-disable-next-line jsdoc/require-param
  /**
   * 删除用户
   */
  userSchema.statics.removeUser = function(id) {
    return this.deleteOne({
      _id: mongoose.Types.ObjectId(id),
    });
  };

  // eslint-disable-next-line jsdoc/require-param
  /**
   * 更新用户数据
   */
  userSchema.statics.updateUser = function(id, upData) {
    return this.updateOne({
      _id: mongoose.Types.ObjectId(id),
    }, upData);
  };

  return mongoose.model('User', userSchema, 'admins');
};
